################################################################################
#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
################################################################################
# CONFIGURATION
################################################################################
# We default to DEFAULT_TARGET if the command line didn't specify a target:
#
# 	TARGET=<MCU> make <options>
#
# Available targets are <MCU>.mk files automatically found by make as the build
# progresses.
################################################################################

#MAKEDBG = 1		# uncomment for exhaustive variable reports
MAKE_ROOT := ./make

include $(MAKE_ROOT)/common.mk

################################################################################
# BOOKKEEPING RULES
################################################################################

.PHONY : targets
targets :
	-@echo Makefile targets: all force docs package clean purge
	-@echo Architecture targets "(TARGET=...)": $(TARGETS)

.PHONY : all
all : $(TARGET) docs docserver

.PHONY : $(TARGET)
$(TARGET) : $(TARGET_LIB)

.PHONY: force
force: clean all

.PHONY : docs
docs :
ifeq ($(OS),Windows_NT)
else
	-@mkdocs build
endif

.PHONY : clean
clean :
	-@rm -fRv $(TARGET_ROOT)

.PHONY : purge
purge :
	-@rm -fRv $(BUILD_ROOT)/* $(LIB_ROOT)/* $(PACKAGE_ROOT)/*

.PHONY : package
package : force
	-@mkdir -p $(PACKAGE_ROOT)
	$(TAR) --create $(TARFLAGS) $(COROS_INCLUDE_FILES)
	mkdir -p ./package/lib
	-ln -v $(TARGET_LIB) ./package/lib/$(notdir $(TARGET_LIB))
	$(TAR) --append $(TARFLAGS) --directory=./package ./lib/$(notdir $(TARGET_LIB))
	$(TAR) --append $(TARFLAGS) --directory=./package ../site
	$(XZ) $(XZFLAGS) $(TARGET_PACKAGE_TAR)
	$(TAR) tvf $(TARGET_PACKAGE_TAR).xz
	rm -fRv ./package

################################################################################
# RECIPES
################################################################################

$(LIB_ROOT)/%.a : $(TARGET_ALL_OBJECT_FILES)
	-@mkdir -p $(LIB_ROOT)
	$(AR) $(ARFLAGS) $@ $^

$(TARGET_ROOT)/%.o : $(COROS_SOURCE_PATH)/%.c
	-@mkdir -p $(TARGET_ROOT)
	$(CC) $(CFLAGS) -S $< -o $(TARGET_ROOT)/$*.s
	$(CC) $(CFLAGS) -c $< -o $(TARGET_ROOT)/$*.o

$(TARGET_ROOT)/%.o : $(COROS_SOURCE_IMPL_PATH)/%.c
	-@mkdir -p $(TARGET_ROOT)
	$(CC) $(CFLAGS) -S $< -o $(TARGET_ROOT)/$*.s
	$(CC) $(CFLAGS) -c $< -o $(TARGET_ROOT)/$*.o

################################################################################
# BUILD RULES
################################################################################

$(TARGET_LIB) : $(TARGET_OBJECT_FILES)

ifeq ($(OS),Windows_NT)
# I'm not going to go through the work of porting nweb to Windows.
# Windows users have plenty of simple web servers they can use.
.PHONY : docserver
docserver :
else
docserver : docs/nweb23.c
	gcc -O3 -Werror -Wall -o $@ $^
endif

################################################################################
# FORCE REBUILD ON MAKEFILE CHANGE
################################################################################

-include marker
marker: Makefile
	@touch $@
	$(MAKE) clean

-include $(TARGET_ROOT)/*.d
